package auth

import (
	user_model "code.gitea.io/gitea/models/user"
	wechat_model "code.gitea.io/gitea/models/wechat"
	context "code.gitea.io/gitea/services/context"
	wechat_service "code.gitea.io/gitea/services/wechat"
)

// WechatQrSignInSuccess 处理扫码登录用户Cookie保存等
//
//	由前端页面 window.location.href 跳转到 /user/login/wechat/success?ticket=${ticket}
func WechatQrSignInSuccess(ctx *context.Context) {

	// 取出 微信公众号二维码 ticket
	ticket := ctx.Base.Req.URL.Query().Get("ticket")

	// 取出扫码用户状态
	qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket)
	if err != nil {
		// 重定向到主页，最终重定向到扫码登录页面
		ctx.Redirect("/")
		return
	}
	defer wechat_service.DeleteWechatQrByTicket(ticket)

	// 检查用户扫码状态：已扫描、绑定，否则重定向到主页，最终重定向到扫码登录页面
	if qrStatus == nil || !qrStatus.IsScanned || !qrStatus.IsBinded {
		ctx.Redirect("/")
		return
	}

	// 查询数据库扫码人信息
	user, err := wechat_model.QueryUserByOpenid(ctx, qrStatus.OpenId)

	// 登录成功，跳转目标页面
	redirect := handleSignInFull(ctx, user, false, true)
	if ctx.Written() {
		return
	}
	ctx.Redirect(redirect)
	return
}

// 检查是否携带了微信扫码注册账号信息，若携带了，同时绑定微信公众号 OpenID
// 若携带了微信公众号二维码ticket的后续步骤发生错误，直接返回 ok = false 阻断注册过程
// 否则继续检查其他注册过程是否合规
// handleWechatRegistration 处理微信扫码注册逻辑
func handleWechatRegistration(ctx *context.Context, ticket string, u *user_model.User) bool {
	// 根据微信二维码 Ticket 获取扫码信息，并删除相应缓存
	qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket)
	if err != nil || qrStatus == nil {
		ctx.Flash.Error("微信公众号扫码注册失败: 微信二维码无效，请使用密码登录")
		ctx.Redirect("/user/login")
		return false
	}

	// 检查二维码是否被扫描以及 OpenID 的有效性
	if !qrStatus.IsScanned || len(qrStatus.OpenId) == 0 {
		ctx.Flash.Error("微信公众号扫码注册失败: 微信二维码无效，请使用密码登录")
		ctx.Redirect("/user/login")
		return false
	}

	// 检查微信账号是否已绑定
	if qrStatus.IsBinded {
		ctx.Flash.Error("微信公众号扫码注册失败：该微信账号已绑定，请直接扫码登录")
		ctx.Redirect("/")
		return false
	}

	// 绑定微信公众号 OpenID 到 DevStar 用户
	err = wechat_model.UpdateOrCreateWechatUser(ctx, u, qrStatus.OpenId)
	if err != nil {
		ctx.Flash.Error("绑定微信公众号失败，请使用密码登录: " + err.Error())
		ctx.Redirect("/user/login")
		return false
	}

	return true // 返回 true 表示注册流程继续
}
